package com.zhht.checkcop.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 
 * @ClassName: EntityFieldUtil
 * @Description: TODO(获取实体属性值不为空的属性map)
 * @author PanBaihui
 * @date 2017年8月19日 下午11:29:18
 * 
 */
public class EntityFieldUtil {

	/**
	 * 
	 * @Title: getEntityFieldMap
	 * @Description: TODO(得到类中属性值不为空的属性map（属性为key，值为value）)
	 * @param entity
	 * @param sign 非签名字段
	 * @throws Exception
	 * @return Map<String,Object> 返回类型
	 * 该类可以返回包括父类的所有属性集合
	 */
	public static <T> Map<String, Object> getEntityFieldMap(T entity,
			String sign) throws Exception {
		@SuppressWarnings("rawtypes")
		Class bean = (Class) entity.getClass();
		// 得到类中属性值不为空的属性map（属性为key，值为value）
		Map<String, Object> map = new HashMap<String, Object>();
		Method[] methods = bean.getMethods();// 获取所有方法
		for (int i = 0; i < methods.length; i++) {
			Method method = methods[i];
			if (method.getName().startsWith("get")) {// 获取所有get方法
				if (!method.getName().equals("getClass")) {// 去除getClass方法
					if (method.invoke(entity) != null) {// 去除值为null的属性
						map.put(getFieldName(method.getName(), "get"),method.invoke(entity));
					}
				}
			}
		}
		map.remove(sign);// 去除非签名字段
		return map;
	}
	
	/**
	 * 
	 * @Title: getFieldValue 
	 * @Description: TODO(获取类属性值) 
	 * @param entity
	 * @param fieldName
	 * @throws Exception    
	 * @return Object    返回类型 
	 * 该类不支持父类属性的获取
	 */
	public static <T> Object getFieldValue(T entity, String fieldName) throws Exception {
		// 得到类对象
	    @SuppressWarnings("rawtypes")
		Class userCla = (Class) entity.getClass();
		Field[] fs = userCla.getDeclaredFields ();
        for ( int i = 0 ; i < fs. length ; i++){
        	Field f = fs[i];
            f.setAccessible(true); // 设置些属性是可以访问的
            if (f.getName().equals(fieldName)) {
            	return f.get(entity);
            }
       }
		return null;
	}

	/**
	 * 
	 * @Title: getFieldName
	 * @Description: TODO(根据get或set方法返回属性名)
	 * @param methodName
	 * @param replace
	 * @return String 返回类型
	 */
	public static String getFieldName(String methodName, String replace) {
		methodName = methodName.replace(replace, "");
		return methodName.substring(0, 1).toLowerCase() + methodName.substring(1);
	}
}